package base

import (
	"gitee.com/wm1998/infra"
	_ "github.com/go-sql-driver/mysql" // 【必须导入MySQL驱动】
	"github.com/sirupsen/logrus"
	"github.com/tietang/dbx"
	"github.com/tietang/props/kvs"
)

//dbx 数据库实例
var database *dbx.Database

func DbxDatabase() *dbx.Database {
	return database
}

// 实现了启动管理器接口的结构体
type DbxDatabaseStarter struct {
	infra.BaseStarter // 包含infra.BaseStarter接口，目的是可以选择性地实现该接口方法
}

// 实现infra.BaseStarter接口的此方法，而不需实现Init()，因加载系统配置文件优先级最高。安装数据库的链接实例
func (s *DbxDatabaseStarter) Setup(ctx infra.StarterContext) {
	conf := ctx.Props() // 获取配置源实例
	//数据库配置
	settings := dbx.Settings{}

	// kvs.Unmarshal()函数可以将配置文件内容解析到settings结构体里
	err := kvs.Unmarshal(conf, &settings, "mysql")
	if err != nil {
		panic(err) // 抛出异常且终止运行
	}
	logrus.Info("MySQL数据库链接信息：", settings.ShortDataSourceName())

	dbx, err := dbx.Open(settings)
	if err != nil {
		panic(err)
	}
	logrus.Info("infra/base/dbx.go - MySQL数据库链接成功：", dbx.Ping()) // Ping 验证与数据库的连接是否仍然存在，必要时建立连接
	database = dbx
}
